#ifndef F_RECVTHREAD_H
#define F_RECVTHREAD_H

#include <QThread>
#include "pcap.h"
#include "projectdb.h"
#include "stdafx.h"

class RecvThread : public QThread
{
    Q_OBJECT
private:
        // 采样初始化参数
        //==============================================================================
    pcap_t* m_fp;				// 打开抓包连接的句柄
    QString m_sGuiYueType;		// 规约类型
    int m_iFirstSmpCnt_Start;	// 第一个ASDU的采样计数的起始位置
    int m_iSmpCnt_Length;		// 采样计数长度
    int m_iASDU_Cnt;			// 一个APDU内ASUD的总数
    int m_iASDU_Start;			// 一个包内第一个ASDU的起始下标
    int m_iAPDU_Start;			// 一个包内APDU的起始下标
    int m_iASDU_Length;			// ASDU的长度
    int m_iFirstData_Start;		// 一个ASDU内 0 通道的数据起始位置
    int m_iData_Length;			// 数据位长度：9-1规约为2，9-2规约为4
    int m_iTongDao;				// 采样通道
    int m_iTongDao_Length;		// 数据通道长度
    int m_iSmpRate;				// 采样速率
    double m_dblFuZhi;				// 幅值：9-1 为11585， 9-2 待定
    bool m_bInitCapPara;		// 初始化抓包参数成功标志
    int m_iTongDaoCount;		// 数据通道总数
    int m_iTongDatCountReal;	// 数据通道总数（实际值）
    int	m_iStartPoint;			// 采样起始SmpCnt值
    int m_iTestedPoints;		// 已获得测量点，用于标记绘图曲线的下标
    bool m_bSamplingPoints;		// 采点过程启动中

    int m_iZhouQi;		    // 采样周期
    int m_Sync;             // 采样同步
    int m_iSync_Start;		// 一个ASDU内采样同步的数据位置
    int m_iMacGl;           //mac过滤标志 0不过滤，1过滤
    int CYPL;
    bool m_bCapIsNoError;
    int m_iTongDaoReal;
    int m_YSTime_Start;//9-2最后4个字节时间信息开始位置
    int m_YSTime_Len;////9-2最后4个字节时间信息长度
    unsigned int m_YSTime_Value;//最后在时间值

    QString APPID;
    QString MAC;
    QString m_sFileLuboName;


 //   double **m_PointArray;	// 绘图点数组
    bool m_bIsChannelShow[TONGDAOCOUNT];
 //   int *m_SmpCntArray;	// 数字量数组
  //  QPointF *m_TstChannelPs;	// 被测通道绘图点，用于绘制标准曲线

    int m_iShuZiLiangMax;			// 数字量最大值
    int m_iShuZiLiangMax_Temp;		// 数字量最大值_临时

    bool m_bIsStandardPort;			// 是否是标准端口，以决定标准采样速率9-2

    QString m_sAnalyseResult;	// 解析包结果存放字符串

    ProjectDB *myDB;			// 全局数据库管理类指针

    double m_dblSin;			// 实部
    double m_dblCos;			// 虚部
    int m_iZhouQiShu;			// 采样周期数
    double m_dblYouXiaoZhi;		// 互感器基波有效值
    double m_dblXW;				// 互感器所示相位
    int m_iLastSmpcnt;			// 最后一个SmpCnt值
    int m_iPoints;				// 计算公式所包含点数

    bool m_isOK;
    int m_iJs;  //计数器
    int m_iLost;//丢帧数
    bool m_bBegin;//开始标志


    int jsFlag;
 //   double m_szl[5*50*200];
    double dblMaxJg;
    double dblMinJg;
    int iSuanFa;
    int m_iType;   //1:MU延时时间;2:其他
    int testSelect;
    int xieboNum;
    int m_iCyfs;        //采样方式

    typedef struct _Muinfo
    {
        QString mac;
        int cypl;
    }s_Muinfo;
    s_Muinfo  Muinfo[100];

    char t_MAC[100][17];
    int t_cypl[100];
    int MuNum;
    int maxSmpCnt;
     int testType;   //0:常规测量;1:扫描列表
      double ti[65535];
      pcap_dumper_t *dumpfile;
  public:
      unsigned int m_YSTime_Value_t;
      int m_MUYSTime_Value;//MU ED YS

public:
     bool m_bStopCap;			// 立即停止标志
    void init();
    double startm,endm;
    void SetChannelShow(int iIndex, bool bIsShow){m_bIsChannelShow[iIndex]=bIsShow;}
    bool GetChannelShow(int iIndex){return m_bIsChannelShow[iIndex];}
  //  double m_PointArray[12][ZHOUQI*200];	// 绘图点数组
    double m_PointArray[12][5*50*200];
    double m_tempArray[12][5*50*200];

    QString AnalyseResult(){return m_sAnalyseResult;}
    bool getIsOK(){return m_isOK;}
    void setIsOK(bool value){m_isOK=value;}
    int getPoint(){return m_iZhouQi * m_iSmpRate;}
    int getMaxShuZiLiang(){return m_iShuZiLiangMax;}
    bool IsOpen(){return m_bInitCapPara;}
    QString GuiYueType(){return m_sGuiYueType;}
    int SmpRate(){return m_iSmpRate;}
    void setSmpRate(int value){m_iSmpRate=value;}
    int getTestChannel(){return m_iTongDao;}
    void setTestChannel(int Value){m_iTongDao = Value;}
    int ChannelCnt(){return m_iTongDaoCount;}		// 通道总数

    void StopCap(bool Value){m_bStopCap = Value;}
    int TestedPoints(){return m_iTestedPoints;}
    void IsStandardPort(bool bValue){m_bIsStandardPort = bValue;}
    void setTestType(int value){testType=value;}
    int getSync(){return m_Sync;}
    void setTestSelect(int value){testSelect=value;}
    void setXieboNum(int value){xieboNum=value;}
    void setiType(int value){m_iType=value;}
    void setCyfs(int value){m_iCyfs=value;}

    double getMaxJg(){return dblMaxJg;}
    double getMinJg(){return dblMinJg;}

    void setMacGl(int value){m_iMacGl=value;}
    QString getLbFileName(){return m_sFileLuboName;}

    // 获得相位值
    double XiangWei(){ return m_dblXW;}
    // 获得有效值
    double YouXiaoZhi()
    {
        double dblYXZ = m_dblYouXiaoZhi;
     //   m_dblYouXiaoZhi = 0;
        return dblYXZ;
    }
    int ZhouQi(){return m_iZhouQiShu;}
    double FuZhi(){return m_dblFuZhi;}
    void setSuanFa(int value){iSuanFa=value;}

public:

    explicit RecvThread(void *pParam, QObject *parent = 0);
    void setRunParam(void *pParam);
    virtual void run();
    void CapOnePacket();
    bool SetCapPara_92(const u_char* pkt_data, int pkt_len);
    bool CapNextPkt(const u_char *pkt_data, int recvLen);
    void setJqxs();
    void harmonic(double *s,int M,int len,int fs);   //s 所有的点 M：谐波次数（可以不用）len smrate*zhouqi fs smrate*50
    void getSysLoad();
    bool SetCapPara_91(const u_char* pkt_data, int pkt_len);
    bool SetCapParamater(int iTongDao, int iZhouQi, int iSmpCntStart, double dblFuZhi);

private:
    pcap_t *t_fp;

signals:
    void f_sigJswc();
    void f_sigCyOver();
    void receivePacket(const u_char *pack_buf, int pack_size);
    void f_showMUYS();

public slots:

};

#endif // F_RECVTHREAD_H
